#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化版Git推送脚本

此脚本用于自动初始化Git仓库并推送到Gitee，避免编码问题和交互式输入。
"""

import os
import sys
import subprocess
import time
from datetime import datetime

# 项目根目录
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

# 默认配置
REPO_NAME = "vulnerability-scanner"
GIT_USERNAME = "vulnerability_user"  # 请在推送到Gitee后修改为实际用户名
GIT_EMAIL = "vulnerability_scanner@example.com"  # 请在推送到Gitee后修改为实际邮箱


def print_with_color(text, color_code=37):  # 默认白色
    """打印带颜色的文本"""
    print(f"\033[{color_code}m{text}\033[0m")


def print_success(text):
    """打印成功信息（绿色）"""
    print_with_color(text, 32)


def print_error(text):
    """打印错误信息（红色）"""
    print_with_color(text, 31)


def print_warning(text):
    """打印警告信息（黄色）"""
    print_with_color(text, 33)


def print_info(text):
    """打印信息（蓝色）"""
    print_with_color(text, 34)


def run_command(command, cwd=None, shell=True, check=False):
    """运行命令并返回结果，处理编码问题"""
    if cwd is None:
        cwd = PROJECT_ROOT
    
    print_info(f"执行: {command}")
    try:
        # 使用universal_newlines=False来获取bytes，避免解码错误
        result = subprocess.run(
            command,
            cwd=cwd,
            shell=shell,
            check=check,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        
        # 尝试解码输出，使用不同的编码
        stdout = ""
        stderr = ""
        
        # 尝试使用utf-8解码
        try:
            stdout = result.stdout.decode('utf-8').strip()
        except UnicodeDecodeError:
            try:
                stdout = result.stdout.decode('gbk').strip()
            except UnicodeDecodeError:
                stdout = str(result.stdout[:1000]) + "..."  # 截断显示
        
        try:
            stderr = result.stderr.decode('utf-8').strip()
        except UnicodeDecodeError:
            try:
                stderr = result.stderr.decode('gbk').strip()
            except UnicodeDecodeError:
                stderr = str(result.stderr[:1000]) + "..."  # 截断显示
        
        if stdout:
            print(f"输出: {stdout}")
        if stderr:
            print_warning(f"错误输出: {stderr}")
            
        return result.returncode, stdout, stderr
    except Exception as e:
        print_error(f"命令执行异常: {str(e)}")
        return -1, "", str(e)


def main():
    """主函数"""
    print("=" * 60)
    print("    简化版Git推送工具")
    print("=" * 60)
    
    # 1. 检查Git是否安装
    print_info("检查Git是否安装...")
    code, output, _ = run_command("git --version")
    if code != 0:
        print_error("错误: Git未安装或不在PATH中")
        print_info("请从 https://git-scm.com/downloads 安装Git")
        return 1
    print_success(f"Git版本: {output}")
    
    # 2. 配置Git用户信息（非交互式）
    print_info("配置Git用户信息...")
    run_command(f'git config user.name "{GIT_USERNAME}"')
    run_command(f'git config user.email "{GIT_EMAIL}"')
    print_info(f"已设置用户: {GIT_USERNAME} <{GIT_EMAIL}>")
    print_warning("注意: 这是临时用户名，请在Gitee上修改为您的实际用户信息")
    
    # 3. 初始化Git仓库（如果还没有初始化）
    git_dir = os.path.join(PROJECT_ROOT, ".git")
    if not os.path.exists(git_dir):
        print_info("初始化Git仓库...")
        code, _, _ = run_command("git init")
        if code != 0:
            print_error("初始化仓库失败")
            return 1
        print_success("仓库初始化成功")
    else:
        print_info("Git仓库已存在")
    
    # 4. 检查.gitignore文件
    gitignore_path = os.path.join(PROJECT_ROOT, ".gitignore")
    if not os.path.exists(gitignore_path):
        print_warning(".gitignore文件不存在，建议创建一个")
    else:
        print_success(".gitignore文件存在")
    
    # 5. 添加所有文件
    print_info("添加文件到暂存区...")
    run_command("git add .")
    
    # 6. 提交更改
    commit_msg = f"初始化项目 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
    print_info(f"提交更改: {commit_msg}")
    code, stdout, stderr = run_command(f'git commit -m "{commit_msg}"')
    if code != 0:
        if "nothing to commit" in stderr:
            print_info("没有新的更改需要提交")
        else:
            print_error("提交失败")
            return 1
    else:
        print_success("提交成功")
    
    # 7. 提示用户在Gitee上创建仓库
    print("\n" + "=" * 60)
    print("    在Gitee上创建仓库的步骤")
    print("=" * 60)
    print(f"1. 访问 https://gitee.com 并登录")
    print(f"2. 点击右上角 '+' -> '新建仓库'")
    print(f"3. 仓库名称: {REPO_NAME}")
    print(f"4. 选择公开/私有")
    print(f"5. 不要勾选 '使用README文件初始化仓库'")
    print(f"6. 点击 '创建仓库'")
    print("=" * 60)
    print("\n请先在Gitee上创建仓库，然后继续")
    
    # 8. 获取用户的Gitee用户名
    gitee_username = input("\n请输入您的Gitee用户名: ").strip()
    if not gitee_username:
        print_error("Gitee用户名不能为空")
        return 1
    
    # 9. 添加远程仓库
    remote_url = f"https://gitee.com/{gitee_username}/{REPO_NAME}.git"
    print_info(f"添加远程仓库: {remote_url}")
    
    # 先删除现有的origin（如果有）
    run_command("git remote remove origin", check=False)
    
    # 添加新的origin
    code, _, _ = run_command(f"git remote add origin {remote_url}")
    if code != 0:
        print_error("添加远程仓库失败")
        return 1
    print_success("远程仓库添加成功")
    
    # 10. 推送代码
    print_info("推送到Gitee仓库...")
    print_warning("注意: 这将使用HTTPS方式推送，您需要在弹出的窗口中输入Gitee账号密码")
    print_info("正在推送，请稍候...")
    
    # 使用subprocess直接运行，允许用户在命令行中输入凭据
    try:
        process = subprocess.Popen(
            "git push -u origin master",
            cwd=PROJECT_ROOT,
            shell=True,
            text=True
        )
        process.wait()
        
        if process.returncode == 0:
            print_success("\n推送成功！代码已上传到Gitee仓库")
            print_success(f"仓库地址: {remote_url}")
        else:
            print_error("\n推送失败")
            print_info("可能的原因:")
            print_info("1. Gitee仓库未创建")
            print_info("2. 用户名或密码错误")
            print_info("3. 网络连接问题")
            return 1
    except Exception as e:
        print_error(f"推送过程中发生异常: {str(e)}")
        return 1
    
    # 11. 输出下一步指导
    print("\n" + "=" * 60)
    print("    推送完成！")
    print("=" * 60)
    print_success(f"您的项目已成功推送到Gitee: {remote_url}")
    print_info("\n接下来，您可以运行系统检查和启动脚本:")
    print_info("python check_and_run.py --force")
    
    return 0


if __name__ == "__main__":
    exit_code = main()
    input("\n按Enter键退出...")  # 防止脚本立即关闭
    sys.exit(exit_code)